Всё описанное проводилось на gentoo linux 2.6.29.
Внимание!
Перед установкой следует позаботиться о достаточном количестве файловых дескрипторов для пользователя, от которого работает squid, при включённом кешировании.
1) Форвардинг пакетов.
Первым делом резрешим пересылку пакетов между сетевыми картами. Делается это через sysclt:
#sysctl net.ipv4.ip_forward = 1
Что бы после ребута оно не слетало, запишем его в /etc/sysctl.conf
2) Установка и настройка файервола: iptables.
Ставим:
#emerge net-firewall/iptables
После установки, добавляем трансляцию адресов NAT:
#iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
#iptables --append FORWARD --in-interface eth1 -j ACCEPT
где, eth0 – внешний интерфейс, а eth1 – внутренний.
Примечание.
Если вдруг при добавлении правила возникают ошибки, проверьте подгружены ли модули ip_nat, ip_conntrack:
lsmod | grep nat
iptable_nat 11077 1
ip_tables 17029 3 iptable_mangle,iptable_nat,iptable_filter
ip_nat 21101 2 iptable_nat
ip_conntrack 53281 6 xt_connlimit,xt_state,iptable_nat,ip_nat
nfnetlink 10713 2 ip_nat,ip_conntrack
x_tables 17349 12 xt_MARK,ipt_REJECT,xt_connlimit,ipt_ULOG,xt_state,xt_multiport,xt_pkttype,iptable_nat,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables
В случаях когда внешний адрес постоянный и заренне известен, лучше использовать SNAT. MASQUERADE предназначен для интерфейсов с динамическими адресами, поэтому тратит больше ресурсов на отслеживание изменений IP-адреса на интерфейсе. Правила с SNAT выглядят вот так (eth0 имеет внешний адрес 111.111.111.111):
#iptables --table nat --append POSTROUTING --out-interface eth0 -j SNAT --to 111.111.111.111
#iptables --append FORWARD --in-interface eth1 -j ACCEPT
3) Установка и настройка squid’a.
#emerge squid
После установки, переходим к настройке. Конфиг можно взять отсюда. Добавим правило заворота на прокси-сервер в файерволе:
iptables -t nat -A PREROUTING -s 10.10.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128
где 10.10.10.0/24 – внутрення подсеть.
Проброс порта во внутреннюю сеть:
#iptables -t nat -A PREROUTING -p tcp -d XX.XX.XX.XX --dport 10000 -j DNAT --to-destination 10.10.10.100:80
где,
XX.XX.XX.XX – внешний IP шлюза,
–dport – порт к которому будут подключаться извне
–to-destination – IP и порт машины в локалке, на которую пробрасывается порт.
Вот небольшая выдержка из сайта habrahabr.ru насчёт использования REDIRECT вместо DNAT
Технически REDIRECT является подвидом DNAT, с той лишь разницей, что адрес назначения (destination) переписывается на primary-адрес интерфейса, с которого получен пакет (вот так это реализовано для IPv4 и для IPv6). Локальные же пакеты будут перенаправляться на порт на адресе 127.0.0.1. Отсюда следует одна неочевидная особенность — если вы перенаправляете пакеты на какой-то порт, но ваше приложение не слушает порт на интерфейсе, на который пришёл пакет, то ничего не заработает — счётчики на правиле будут увеличиваться, но в ответ клиенту будут улетать tcp-reset’ы или icmp-port-unreachable (если там UDP). Точно так же, например, не получится перенаправлять входящие извне пакеты приложению, которое слушает только 127.0.0.1. Если же на интерфейсе нет адреса вообще (например, если вы используете unnumbered-интерфейс), то пакеты будут отброшены. И так как это завязано на коннтраке, то не забывайте очищать таблицу коннтрака после изменения правил; а так же учтите, что под это правило попадают только пакеты соединений с состоянием NEW, то есть только первый пакет соединения, которого ещё нет в таблице коннтрака. Отловить же эти пакеты в других цепочках можно через конструкцию “-m conntrack –ctstate DNAT”. Вот как-то так.
4) Просмотр состояний.
– посмотреть список правил
#iptables -L [chain]
Так де можно использовать команду
#iptables -S [chain]
Разница лишь в том, что первая вторая выводит их в формате iptables-save.
Для просмотра правил NAT трансляции можно воспользоваться такой командой:
#iptables -L -t nat
Посмотреть текущие NAT-сессии можно так:
#netstat -M - если у вас настроен МАСКАРАДИНГ
#netstat-nat - если у вас NAT
Последняя утилита ставиться отдельно.
5) Пример файла с правилами.
#!/bin/sh
IPT="/sbin/iptables"
# Reset Default Policies
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
# Flush all rules
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
# Erase all non-default chains
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
iptables --table nat --append POSTROUTING --out-interface eth0 -j SNAT 111.111.111.111
iptables --append FORWARD --in-interface eth1 -j ACCEPT
Оригинал статьи здесь.
Опубликовано с разрешения редакции журнала RootUA и газеты FOSS News